﻿using System;
using SIIE_ERP.Codigo;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SIIE_ERP.BaseDatos.Inventarios.Transacciones
{
    public class Trans_Inv_Fisico
    {

        #region Propiedades

        private string _RFC;
        private string _Usuario;

        #endregion
        
        #region Constructores

        public Trans_Inv_Fisico(string RFC, string Usuario)
        {
            this._RFC = RFC;
            this._Usuario = Usuario;
        }

        #endregion

        #region SELECT

        public DataTable Get_Report(int Id_MovInventario)
        {
            string Query = @"

                SELECT        

	                dbo_Trans_Inv_Fisico_Cab.Id_Inv_Fisico, 
	                dbo_Trans_Inv_Fisico_Cab.Secuencia, 
	                dbo_Trans_Inv_Fisico_Cab.Estatus, 
	                dbo_Cat_Estatus.Nombre AS Estatus_Desc, 
	                dbo_Trans_Inv_Fisico_Cab.Fecha_Inv_Fisico, 
	                dbo_Trans_Inv_Fisico_Cab.Descripcion, 
	                dbo_Trans_Inv_Fisico_Cab.Id_Almacen, 
	                dbo_Cat_Almacen.Descripcion AS Almacen, 
	                dbo_Trans_Inv_Fisico_Linea.Id_Linea_Inv_Fisico, 
	                dbo_Trans_Inv_Fisico_Linea.Secuencia AS Secuencia_Linea, 
	                dbo_Trans_Inv_Fisico_Linea.Id_Articulo, 
	                dbo_Cat_Articulo.Clave AS Clave_Articulo, 
	                dbo_Cat_Articulo.Nombre AS Articulo,
	                dbo_Cat_Articulo.NombreTicket, 
	                dbo_Trans_Inv_Fisico_Linea.Cantidad, 
	                dbo_Trans_Inv_Fisico_Linea.Existencia, 
	                dbo_Trans_Inv_Fisico_Linea.Variacion, 
	                dbo_Cat_UM.Nombre AS UM, 
	
	                dbo_Trans_Inv_Fisico_Linea.Cantidad * dbo_Cat_Articulo.Costo_Std AS Costo_Std, 
	                dbo_Trans_Inv_Fisico_Linea.Cantidad * dbo_Cat_Articulo.Costo_Ultimo AS Costo_Ultimo, 
	                dbo_Trans_Inv_Fisico_Linea.Cantidad * dbo_Cat_Articulo.Costo_Promedio AS Costo_Promedio, 
	
	                Switch(
		                dbo_Cat_Articulo.Costo_Pref = '1', 	dbo_Trans_Inv_Fisico_Linea.Cantidad * dbo_Cat_Articulo.Costo_Std ,
		                dbo_Cat_Articulo.Costo_Pref = '2', 	dbo_Trans_Inv_Fisico_Linea.Cantidad * dbo_Cat_Articulo.Costo_Promedio ,
		                dbo_Cat_Articulo.Costo_Pref = '3', 	dbo_Trans_Inv_Fisico_Linea.Cantidad * dbo_Cat_Articulo.Costo_Ultimo
                    ) AS Costo_Preferido, 			  
			  	
	                dbo_Trans_Inv_Fisico_Linea.Comentarios, 
	                dbo_Cat_Moneda.Clave AS Clave_Moneda, 
	                dbo_Cat_Moneda.Simbolo AS Simbolo_Moneda, 
	                dbo_Cat_Moneda.Nombre AS Moneda, 
	                dbo_Cat_Grupo_Productos.Nombre AS Grupo_Producto, 
	                dbo_Cat_Subgrupo_Productos.Nombre AS Subgrupo_Producto, 
	                dbo_Cat_Linea.Nombre AS Linea, 
	                dbo_Cat_Talla.Nombre AS Talla, 
	                dbo_Cat_Color.Nombre AS Color

                FROM
	
	                (((((((((((dbo_Trans_Inv_Fisico_Cab 
	                INNER JOIN dbo_Trans_Inv_Fisico_Linea ON dbo_Trans_Inv_Fisico_Cab.Id_Inv_Fisico = dbo_Trans_Inv_Fisico_Linea.Id_Inv_Fisico )
	                INNER JOIN dbo_Cat_Almacen ON dbo_Trans_Inv_Fisico_Cab.Id_Almacen = dbo_Cat_Almacen.Id_Almacen )
	                INNER JOIN dbo_Cat_Articulo ON dbo_Trans_Inv_Fisico_Linea.Id_Articulo = dbo_Cat_Articulo.Id_Articulo )
	                INNER JOIN dbo_Cat_Moneda ON dbo_Cat_Articulo.Id_Moneda = dbo_Cat_Moneda.Id_Moneda )
	                INNER JOIN dbo_Cat_Estatus ON dbo_Trans_Inv_Fisico_Cab.Estatus = dbo_Cat_Estatus.Estatus )
	                INNER JOIN dbo_Cat_Grupo_Productos ON dbo_Cat_Articulo.Id_GrupoProductos = dbo_Cat_Grupo_Productos.Id_GrupoProductos )
	                INNER JOIN dbo_Cat_Subgrupo_Productos ON dbo_Cat_Articulo.Id_SubgrupoProductos = dbo_Cat_Subgrupo_Productos.Id_SubgrupoProductos )
	                INNER JOIN dbo_Cat_Linea ON dbo_Cat_Articulo.Id_Linea = dbo_Cat_Linea.Id_Linea )
	                INNER JOIN dbo_Cat_Talla ON dbo_Cat_Articulo.Id_Talla = dbo_Cat_Talla.Id_Talla )
	                INNER JOIN dbo_Cat_Color ON dbo_Cat_Articulo.Id_Color = dbo_Cat_Color.Id_Color )
	                INNER JOIN dbo_Cat_UM ON dbo_Cat_Articulo.Id_UM = dbo_Cat_UM.Id_UM )
    
                WHERE 

                    dbo_Trans_Inv_Fisico_Cab.Id_Inv_Fisico = @@Id 

            ";
            Query = Query.Replace("@@Id", Id_MovInventario.ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Trans_Inv_Fisico()
        {
            string Query = @"SELECT 
                                A1.*,
                                A2.Descripcion as Desc_Almacen
                             FROM (
                                dbo_Trans_Inv_Fisico_Cab AS A1
                                    INNER JOIN dbo_Cat_Almacen AS A2 ON A1.Id_Almacen = A2.Id_Almacen
                             )
                            WHERE A1.RFC = '@@RFC'";
            Query = Query.Replace("@@RFC", this._RFC);
            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Trans_Inv_Fisico_Por_Id(int Id)
        {
            string Query = @"SELECT 
                                A1.*,
                                A2.Descripcion as Desc_Almacen
                             FROM (
                                dbo_Trans_Inv_Fisico_Cab AS A1
                                    INNER JOIN dbo_Cat_Almacen AS A2 ON A1.Id_Almacen = A2.Id_Almacen
                             )
                            WHERE Id_Inv_Fisico = @@Id_MovInventario";
            Query = Query.Replace("@@Id_MovInventario", Id.ToString());
            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Trans_Inv_Fisico_Lineas_Por_IdInventario(int Id)
        {
            string Query = @"SELECT 
                               A1.*,
                               A3.Nombre as Desc_Articulo                           
                            FROM((
                               dbo_Trans_Inv_Fisico_Linea as A1
                                    INNER JOIN dbo_Trans_Inv_Fisico_Cab as A2 ON A1.Id_Inv_Fisico = A2.Id_Inv_Fisico)
                                    INNER JOIN dbo_Cat_Articulo as A3 ON A1.Id_Articulo = A3.Id_Articulo
                            )
                            WHERE A1.Id_Inv_Fisico = @@Id
                            ";

            Query = Query.Replace("@@Id", Id.ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }

        #endregion

        #region INSERT

        public Respuesta Insert_Trans_Inv_Fisico_Linea(
            string IdInventario,
            string IdArticulo,
            string Cantidad,
            string Existencia,
            string Comentario
        )
        {
            string Query = @"INSERT INTO dbo_Trans_Inv_Fisico_Linea (                
                                Id_Linea_Inv_Fisico,
                                RFC,
                                Id_Inv_Fisico,
                                Secuencia,
                                Id_Articulo,
                                Cantidad,
                                Existencia,
                                Variacion,          
                                Comentarios,
                                Fecha_Alta,
                                Usuario_Alta,
                                Fecha_Mantto,
                                Usuario_Mantto
                              )VALUES(
                                IIF(DCount('*', 'dbo_Trans_Inv_Fisico_Linea') = 0, 1, DMax('Id_Linea_Inv_Fisico', 'dbo_Trans_Inv_Fisico_Linea') + 1),
                                '@@RFC',
                                @@IdInventario,
                                IIF(DCount('*', 'dbo_Trans_Inv_Fisico_Linea', ""RFC = '@@RFC'"") = 0, 1, DMax('Id_Linea_Inv_Fisico', 'dbo_Trans_Inv_Fisico_Linea', ""RFC = '@@RFC'"") + 1),

                                @@IdArticulo,
                                @@Cantidad,
                                @@Existencia,
                                @@Variacion,
                                '@@Comentario',
                                NOW(),
                                '@@Usuario',
                                NOW(),
                                '@@Usuario'
                              )
                            ";

            Query = Query.Replace("@@RFC", this._RFC);
            Query = Query.Replace("@@IdInventario", IdInventario);
            Query = Query.Replace("@@IdArticulo", IdArticulo);
            Query = Query.Replace("@@Cantidad", Cantidad);
            Query = Query.Replace("@@Existencia", Existencia);
            Query = Query.Replace("@@Variacion", (Int32.Parse(Cantidad) - Int32.Parse(Existencia)).ToString());
            Query = Query.Replace("@@Comentario", Comentario);
            Query = Query.Replace("@@Usuario", this._Usuario);

            return SrvDB.ExecuteQuery_Insert(Query);
        }

        public Respuesta Insert_Trans_Inv_Fisico_Cab(
	        EstatusDocs_Id Estatus,
	        DateTime Fecha_Mov,
	        string Descripcion,
	        int Id_Almacen
        )
        {            
            try
            {
                string Query = @"

                INSERT INTO dbo_Trans_Inv_Fisico_Cab
                (
                    Id_Inv_Fisico,
	                RFC,
	                Secuencia,
	                Estatus,
	                Fecha_Inv_Fisico,
	                Id_Almacen,
                    Descripcion,
	                Partidas,
	                UserHostAddress,
	                Fecha_Alta,
	                Usuario_Alta,
	                Fecha_Mantto,
	                Usuario_Mantto
                )
                VALUES
                (
                    IIF(DCount('*', 'dbo_Trans_Inv_Fisico_Cab') = 0, 1, DMax('Id_Inv_Fisico', 'dbo_Trans_Inv_Fisico_Cab') + 1),
                    '@@RFC',
                    IIF(DCount('*', 'dbo_Trans_Inv_Fisico_Cab', ""RFC = '@@RFC'"") = 0, 1, DMax('Id_Inv_Fisico', 'dbo_Trans_Inv_Fisico_Cab', ""RFC = '@@RFC'"") + 1),
                    @@Estatus,
	                '@@Fecha_Mov',
                    @@Id_Almacen,	                
                    '@@Descripcion',
	                0,
	                '',
                    NOW(),
                    '@@Usuario_Alta',   
                    NOW(),
                    '@@Usuario_Mantto'
                )";

                Query = Query.Replace("@@RFC", this._RFC);

                Query = Query.Replace("@@Estatus", Estatus.GetHashCode().ToString());
                Query = Query.Replace("@@Fecha_Mov", Fecha_Mov.ToString());
                Query = Query.Replace("@@Descripcion", Descripcion);
                Query = Query.Replace("@@Id_Almacen", Id_Almacen.ToString());

               
                Query = Query.Replace("@@Usuario_Alta", this._Usuario);
                Query = Query.Replace("@@Usuario_Mantto", this._Usuario);

                return SrvDB.ExecuteQuery_Insert(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
            
        }


        #endregion

        #region UPDATE

        public Respuesta Update_Estatus_Inv_Fisico(Int32 Id, EstatusDocs_Id estatus)
        {
            string Query = @"UPDATE dbo_Trans_Inv_Fisico_Cab SET                            
                                    Estatus = @@Estatus
                            WHERE Id_Inv_Fisico = @@Id

                    ";

            Query = Query.Replace("@@Estatus", estatus.GetHashCode().ToString());
            Query = Query.Replace("@@Id", Id.ToString());

            return SrvDB.ExecuteQuery_Update(Query);
        }

        #endregion

        #region DELETE

        public Respuesta Delete_Trans_Inv_Fisico_Linea_Por_Id(int Id)
        {
            string Query = @"DELETE FROM dbo_Trans_Inv_Fisico_Linea WHERE Id_Linea_Inv_Fisico = @@Id";            
            Query = Query.Replace("@@Id", Id.ToString());
            return SrvDB.ExecuteQuery_Delete(Query);
        }

        #endregion
    }
}
